---@class wifi
---https://nodemcu.readthedocs.io/en/release/modules/wifi/
wifi = {
    --- Staion模式
    STATION = "STATION",
    --- AP模式
    SOFTAP = "SOFTAP",
    --- Staion&Ap模式
    STATIONAP = "STATIONAP",
    --- 空模式
    NULLMODE = "NULLMODE",
    PHYMODE_N = "PHYMODE_N",
    PHYMODE_B = "PHYMODE_B",
    PHYMODE_G = "PHYMODE_G",
    COUNTRY_AUTO = "COUNTRY_AUTO",
    COUNTRY_MANUAL = "COUNTRY_MANUAL"
}

wifi.sta = {}
wifi.ap = {}
wifi.eventmon = {
    STA_CONNECTED = "STA_CONNECTED",
    STA_DISCONNECTED = "STA_DISCONNECTED",
    STA_AUTHMODE_CHANGE = "STA_AUTHMODE_CHANGE",
    STA_GOT_IP = "STA_GOT_IP",
    STA_DHCP_TIMEOUT = "STA_DHCP_TIMEOUT",
    AP_STACONNECTED = "AP_STACONNECTED",
    AP_STADISCONNECTED = "AP_STADISCONNECTED",
    AP_PROBEREQRECVED = "AP_PROBEREQRECVED"
}

---注册/取消WiFi事件监视器的回调。注册回调函数后，可以随时调用该函数来更新回调函数.
---
---请额外注意，如果在connect传递了回调函数，eventmon不会触发STA_CONNECTED事件
---@param event wifi.eventmon.STA_CONNECTED|wifi.eventmon.STA_DISCONNECTED|wifi.eventmon.STA_AUTHMODE_CHANGE|wifi.eventmon.STA_GOT_IP|wifi.eventmon.STA_DHCP_TIMEOUT|wifi.eventmon.AP_STACONNECTED|wifi.eventmon.AP_STADISCONNECTED|wifi.eventmon.AP_PROBEREQRECVED|
---@param callback function
---@return number
function wifi.eventmon.register(event，callback)
end

---
---获取当前WiFi通道
---@return number
function wifi.getchannel()
end

---
---获取当前国家信息
---@return { country:string,start_ch:string,end_ch:string,policy:number }
function wifi.getcountry()
end

---获取默认的WiFi运行模式
---@return wifi.STATION|wifi.SOFTAP|wifi.STATIONAP|wifi.NULLMODE
function wifi.getdefaultmode()
end

---获取WiFi运行模式
---@go https://nodemcu.readthedocs.io/en/release/modules/wifi/#getmode
---@return wifi.STATION|wifi.SOFTAP|wifi.STATIONAP|wifi.NULLMODE
function wifi.getmode()
end

---获取WiFi物理模式
---@go https://nodemcu.readthedocs.io/en/release/modules/wifi/#getphymode
---@return wifi.PHYMODE_N|wifi.PHYMODE_B|wifi.PHYMODE_G
function wifi.getphymode()
end

---配置WiFi是否在NULL_MODE下自动休眠。默认启用。
---@go https://nodemcu.readthedocs.io/en/release/modules/wifi/#nullmodesleep
---@param enable boolean
---@return boolean
function wifi.nullmodesleep(enable)
end

---从挂起状态唤醒wifi或取消挂起的wifi
---@go https://nodemcu.readthedocs.io/en/release/modules/wifi/#resume
---@param resume_cb fun():void
---@return nil
function wifi.resume(resume_cb)
end

---设置当前国家信息。
---@param country_info {  country:string,start_ch:string,end_ch:string,policy:number }
---@return nil
function wifi.setcountry(country_info)
end

---配置使用的WiFi模式。
---NodeMCU可以在以下四种WiFi模式中运行:
---1.站模式(wifi.STATION).NodeMCU设备加入现有网络的位置接入点
---2.AP模式(wifi.SOFTAP).它创建自己的网络，其他网络可以加入
---3.站模式+AP模式(wifi.STATIONAP).它既创建了自己的网络，同时又加入了另一个现有的网络无线网络了当使用联合电台+ AP模式时，两个网络将使用相同的频道，因为电台只能在一个频道上收听。
---4.关闭WIFI(wifi.NULLMODE)
---@param mode wifi.STATION|wifi.SOFTAP|wifi.STATIONAP|wifi.NULLMODE
---@param save boolean
---@return wifi.STATION|wifi.SOFTAP|wifi.STATIONAP|wifi.NULLMODE
function wifi.setmode(mode, save)
end

---设置WiFi物理模式。
---wifi.PHYMODE_B 802.11b, 更大的范围，低传输速率，更多的电流吸出
---wifi.PHYMODE_G 802.11g, 中等范围，中等传输速率，中等电流绘制
---wifi.PHYMODE_N 802.11n, 最小范围，快速传输速率，最小电流绘制(仅Station模式)
---@param mode wifi.PHYMODE_N|wifi.PHYMODE_B|wifi.PHYMODE_G
---@return wifi.PHYMODE_N|wifi.PHYMODE_B|wifi.PHYMODE_G
function wifi.setphymode(mode)
end

---设置WiFi最大TX功率。
---此设置不会在整个电源周期中持久化，并且Espressif SDK文档没有指定在深度睡眠后是否持久化该设置。
---使用的默认值是从ESP8266的初始化数据的byte 34中读取的，因此它的值是由制造商定义的。默认值82, 对应TX的最大功率。
---降低此设置可以降低电池支持设备的功耗。
---@param max_tpw number 射频发送功率的最大值，单位:0.25 dBm，范围[0,82]。
---@return nil
function wifi.setmaxtxpower(max_tpw)
end

---开始自动配置，成功后自动设置SSID和密码。
---打算使用SmartConfig应用程序，如expressif的Android &iOS应用程序。
---只能在wifi.STATION模式使用
---注意：SmartConfig默认是禁用的，在构建固件之前可以通过user_config.h中的设置来启用。WIFI_SMART_ENABLE
---@param type number @0代表ESP_TOUCH, 1代表AIR_KISS。
---@param callback fun(ssid:string,password:string):void @回调函数
---@return nil
function wifi.startsmart(type, callback)
end

---
---停止智能配置进程
---@return nil
function wifi.stopsmart()
end

---暂停Wifi以减少当前消耗。
---@param duration number 挂起持续时间(以微秒为单位)。如果指定了挂起持续时间，挂起将是无限期的(范围:0或50000 - 268435454 μs (0:4:28 000454))0
---@param suspend_cb function @[选填]当WiFi挂起时执行回调。
---@param resume_cb function @[选填]当WiFi从暂停中醒来时执行的回调。
---@param preserve_mode boolean @[选填，默认为true]通过节点休眠保持当前WiFi模式。 如果为true, Station和StationAP模式将在NodeMCU恢复时自动重新连接到先前配置的接入点。
---@return number @0 WiFi已唤醒,1 WiFi悬架待定。(等待空闲任务),2 WiFi挂起。
function wifi.suspend(duration, suspend_cb, resume_cb, preserve_mode)
end

---站模式下自动连接到AP。
---@param auto number 为0表示禁用自动连接，1表示启用自动连接
---@return nil
function wifi.sta.autoconnect(auto)
end

---从wifi.sta.getapinfo()返回的列表中选择接入点。
---https://nodemcu.readthedocs.io/en/release/modules/wifi/#changeap
---@param ap_index number 要修改为的接入点索引。(范围:1-5)- Wifi.sta.getapInfo()和Wifi.sta.getapIndex()使用的对应索引
---@return boolean
function wifi.sta.changeap(ap_index)
end

---清除当前保存的WiFi站配置，从flash中擦除它。
---
---当不需要完整的node.restore()时，可能用于某些工厂重置场景，或准备使用终端用户设置，以便SoftAP能够锁定单个硬件无线电通道。
---https://nodemcu.readthedocs.io/en/release/modules/wifi/#clearconfig
---@return boolean
function wifi.sta.clearconfig()
end

---@class station_config
---@field ssid string @[必填]小于32字节的字符串。
---@field pwd string @[必填]小于32字节的字符串。
---@field auto boolean @[选填]小于32字节的字符串。
---@field bssid number @[选填]包含接入点MAC地址的字符串。如果有多个接入点具有相同的SSID，可以设置BSSID。如果你为一个特定的SSID设置了BSSID，并且想要配置台站只连接到同一个SSID而不需要BSSID，你必须先配置台站到不同的SSID，然后连接到你想要的SSID
---@field save boolean @[选填，默认为true]保存Station配置到flash

---设置WiFi站配置。
---https://nodemcu.readthedocs.io/en/release/modules/wifi/#wifistaconfig
---@param station_config station_config
---@return boolean
function wifi.sta.config(station_config)
end

---以Station模式连接已配置的AP。只有在wifi.sta.config()中禁用了auto-connect时才需要调用它。
---
---请额外注意，如果在connect传递了回调函数，eventmon不会触发STA_CONNECTED事件
---https://nodemcu.readthedocs.io/en/release/modules/wifi/#wifistaconnect
---@param connected_cb fun(result:{SSID:string,BSSID:string,channel:number}):void
---@return nil
function wifi.sta.connect(connected_cb)
end

---在Station模式下断开AP连接
---https://nodemcu.readthedocs.io/en/release/modules/wifi/#wifistadisconnect
---@param disconnected_cb fun(SSID:string,BSSID:string,channel:number):void
---@return nil
function wifi.sta.disconnect(disconnected_cb)
end

---扫描AP列表作为一个Lua表到回调函数
---https://nodemcu.readthedocs.io/en/release/modules/wifi/#wifistagetapinfo
---@param cfg {ssid:string,bssid:string,channel:number,show_hidden:boolean} @[可选参数]SSID == nil，不过滤SSID bssid == nil，不过滤SSID
---@param format number @[可选参数]选择输出表格式，默认为0; 0-( authmode, RSSI, BSSID, Channel),1-(SSID, RSSI, authmode, Channel)
---@param callback fun(table):void
---@return nil
function wifi.sta.getap(cfg, format, callback)
end

---获取AP缓存中当前接入点的索引
---@return number @当前选定接入点的索引。(范围:1 - 5)
function wifi.sta.getapindex()
end

---获取ESP8266站缓存的ap信息
---https://nodemcu.readthedocs.io/en/release/modules/wifi/#wifistagetap
---@note 任何配置了save disabled的接入点将填充此列表(似乎覆盖存储在flash中的ap)，直到重新启动。wifi.sta.config({save=false})
---@return {qty:number,ssid:string,pwd:string|nil,bssid:string|nil,}
function wifi.sta.getapinfo()
end

---获取station模式下的广播地址
---@return string @广播地址作为字符串，例如“192.168.0.255”，如果IP地址=“0.0.0.0”,返回nil
function wifi.sta.getbroadcast()
end

---获取WiFi站配置
---@param return_table boolean
---@return {ssid:string,pwd:string,bssid:string,bssid_set:string}|string, string, string, string @返回table或者ssid, password, bssid_set, bssid
function wifi.sta.getconfig(return_table)
end

---获取存储在flash中的默认WiFi站配置。
---@param return_table boolean
---@return {ssid:string,pwd:string,bssid:string,bssid_set:string}|string, string, string, string @返回table或者ssid, password, bssid_set, bssid
function wifi.sta.getdefaultconfig(return_table)
end

---获取当前站点主机名
---@return string
function wifi.sta.gethostname()
end

---获取站模式下的IP地址、子网掩码和网关地址
---@return string,string,string @IP地址(address)，子网掩码(netmask)，网关地址(gateway)
function wifi.sta.getip()
end

---在工作站模式下获取MAC地址
---@return string @例如“18:fe:34:a2:d7:34”
function wifi.sta.getmac()
end

---获取ESP8266站所连接接入点的RSSI(Received Signal Strength Indicator)。
---@return string|nil @如果工作站没有连接到接入点，则返回nil
function wifi.sta.getrssi()
end

---设置flash中存储的最大接入点数。—该值写入flash
---@param qty number @存储在flash中的接入点数量。范围:1-5(默认值:1)
---@return boolean
function wifi.sta.setaplimit(qty)
end

---设置主机名。
---@param hostname string @必须只包含字母，数字和连字符('-')和32个字符或更少的第一个字符和最后一个字符是字母数字
---@return boolean
function wifi.sta.sethostname(hostname)
end

---在站点模式下设置IP地址、子网掩码和网关地址。
---@param cfg {ip:string,netmask:string,gateway:string} @
---@return boolean
function wifi.sta.setip(cfg)
end

---在工作站模式下设置MAC地址
---@param mac string
---@return nil
function wifi.sta.setmac(mac)
end

---配置当工作站连接到接入点时使用的WiFi调制解调器休眠类型。
---@param type_wanted string
---@return nil
function wifi.sta.sleeptype(type_wanted)
end

---获取工作站模式下的当前状态。
---@param
---@return nil
function wifi.sta.status()
end

---AP模式下设置SSID和密码。请确保密码至少8个字符!如果你不，它将默认为没有密码和不设置SSID!它仍然可以作为接入点工作，但是使用默认的SSID，例如NODE_9997C3。
---@param cfg table
---@return nil
function wifi.ap.config(cfg)
end

---Deauths(强制移除)客户端，首先发送相应的IEEE802.11管理包，然后将客户端从数据结构中移除。
---使用的IEEE802.11原因码是2，表示“先前的身份验证不再有效”(AUTH_EXPIRE)
---@param mac string
---@return nil
function wifi.ap.deauth(mac)
end

---在AP模式下获取广播地址。
---@param
---@return nil
function wifi.ap.getbroadcast()
end

---获取以AP模式连接到设备的客户机表。
---@param
---@return nil
function wifi.ap.getclient()
end

---
---@param
---@return nil
function wifi.ap.getconfig()
end

---
---@param
---@return nil
function wifi.ap.getdefaultconfig()
end

---
---@param
---@return nil
function wifi.ap.getip()
end

---
---@param
---@return nil
function wifi.ap.getmac()
end

---
---@param
---@return nil
function wifi.ap.setip()
end

---
---@param
---@return nil
function wifi.ap.setmac()
end

---
---@param
---@return nil
function wifi.ap.dhcp.config()
end

---
---@param
---@return nil
function wifi.ap.dhcp.start()
end

---
---@param
---@return nil
function wifi.ap.dhcp.stop()
end
